home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
エラーダイアログ
/
EDIALOG.C
next >
Wrap
Text File
|
1994-03-10
|
18KB
|
504 lines
/******************************************************************************
* edialog.c: エラーダイアログの表示
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*
* 機能説明:
* このプログラムは、DMErrorを使って様々なエラーダイアログの表示を行いま
* す。
*
* 使用方法:
* エラーダイアログ.xを起動して、そのウインドウ内でマウスの右ボタンを押し、
* ポップアップメニューからエラーダイアログの種類を選択します。
* ウィンドウ上の[実行]ボタンを押すと、指定のエラーダイアログが表示されま
* す。
*/
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <menu.h> /* メニューマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "edialog.h" /* このプログラム固有のヘッダファイル */
char _sxkernelcomm[] = SXKERNEL; /* カーネル起動コマンド */
/******************************************************************************
* main(): メイン関数
******************************************************************************
*/
int main(void)
{
ComVal cv; /* 共通変数 */
if (!init(&cv)) { /* 初期化処理を行う */
showErrDialog(&cv); /* エラーダイアログを表示する */
cv.endFlag = TRUE; /* 終了フラグをセットする */
}
/* 終了フラグがセットされるまでループする */
while (!cv.endFlag) {
cv.errorCode = 0; /* エラーコードをクリアする */
/* タスクマンからイベントを取得する */
TSEventAvail(cv.eventMask, &cv.event);
/* 各イベントに対応した処理を行う */
switch (cv.event.ts.what) {
case E_MSLDOWN: /* マウスレフトダウンイベント */
msLDownEvent(&cv);
break;
case E_MSRDOWN: /* マウスライトダウンイベント */
msRDownEvent(&cv);
break;
case E_KEYDOWN: /* キーダウンイベント */
keyDownEvent(&cv);
break;
case E_UPDATE: /* アップデートイベント */
updateEvent(&cv);
break;
case E_ACTIVATE: /* アクティベートイベント */
activateEvent(&cv);
break;
case E_SYSTEM1: /* システムイベント */
case E_SYSTEM2:
systemEvent(&cv);
break;
}
if (cv.errorCode != 0) /* エラーが発生したか? */
showErrDialog(&cv); /* エラーダイアログを表示する */
}
/* 終了手続きを行う */
endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
return 0;
}
/******************************************************************************
* init(): 初期化処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 初期化成功
* = FALSE: 初期化失敗(終了)
* 注釈: 共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
* 表示などを行う。
*/
BOOLEAN init(ComVal *pcv)
{
pcv->windowPtr = NULL; /* ウィンドウポインタ */
pcv->activeFlag = FALSE; /* アクティブフラグ */
pcv->eventMask = EVENTMASK; /* イベントマスク */
pcv->errorCode = 0; /* エラーコード */
pcv->endFlag = FALSE; /* 終了フラグ */
pcv->chrBtnHdl = NULL; /* 文字ボタンのコントロールハンドル */
pcv->lastMenu = 1; /* 前回選択したメニュー番号 */
TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する */
if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
pcv->errorCode = 1; /* バージョン2より古い */
return FALSE; /* 失敗したのでFALSEを返す */
}
if (!createWindow(pcv)) { /* ウィンドウを作成する */
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
GMForeColor(G_BLACK); /* フォアグラウンドカラーを黒にする */
/* バックグラウンドカラーをライトグレーにする */
GMBackColor(G_LGRAY);
if (!createControl(pcv)) { /* コントロールを作成する */
pcv->errorCode = 3; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
WMShow(pcv->windowPtr); /* ウィンドウを表示する */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* createWindow(): ウィンドウの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createWindow(ComVal *pcv)
{
int paramFlags; /* パラメータの有無 */
Rect rc;
Task task; /* タスク管理レコード */
static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
paramFlags = TSTakeParam( /* コマンドラインを解析する */
task.command, /* コマンドライン */
&rc, /* 指定されたウィンドウ位置 */
NULL, /* 最終文字列を格納しない */
0, /* アドレステーブルを保存しない */
NULL, /* アドレステーブルを作成しない */
NULL); /* ポインタを確保しない */
if (!(paramFlags & 1)) { /* ウィンドウ位置の指定があるか? */
/* ない場合、システムからウィンドウの左上座標を取得する */
rc = winSize;
GMSlideRect(&rc, TSGetWindowPos());
}
pcv->windowPtr = WMOpen( /* ウィンドウをオープンする */
NULL, /* ウィンドウポインタを確保する */
&rc, /* ウィンドウの表示位置 */
WINTITLE, /* ウィンドウタイトル */
FALSE, /* オープン時に描画しない */
WI_STD2 << 4, /* タイトルの広い標準ウィンドウ */
W_FRONT, /* 一番手前に表示する */
TRUE, /* クローズボタンを使用する */
TSGetID()); /* 自分のタスクID */
if (pcv->windowPtr == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* createControl(): コントロールの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createControl(ComVal *pcv)
{
static Rect bounds = { /* 文字ボタンの位置と大きさ */
CHR_X, CHR_Y, CHR_X + CHRBTN_H + 12 * 2, CHR_Y + CHRBTN_V
};
pcv->chrBtnHdl = CMOpen( /* 文字ボタンを作成する */
pcv->windowPtr, /* ウィンドウポインタ */
&bounds, /* 描画する位置と大きさ */
(_LASCII)"\x04実行", /* 文字ボタンのタイトル */
TRUE, /* 描画許可フラグ */
0, /* コントロールの初期値 */
0, /* コントロールの最小値 */
1, /* コントロールの最大値 */
CI_CHRBTN << 4, /* 文字ボタンのリソースID×16 */
0); /* ユーザーの初期値 */
if (pcv->chrBtnHdl == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* msLDownEvent(): マウスレフトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
* この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
*/
void msLDownEvent(ComVal *pcv)
{
int partCode; /* ウィンドウのパートコード */
Window *wTemp; /* テンポラリウィンドウポインタ */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
/* ウィンドウをアクティブにする */
WMSelect(pcv->windowPtr);
/* ボタンが押された場所のパートコードを取得する */
partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
/* タイトルバー以外か、左ボタンが離されたか? */
if (partCode != W_INDRAG || !EMLStill())
return;
}
/* マウスのボタンが押されている間、ウィンドウ上の各種処理を
システムに任せて、ボタンが押された、または離された場所の
パートコードを取得する */
partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
switch (partCode) {
case W_INCLOSE: /* クローズボタン */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
case W_ININSIDE: /* ウィンドウの内側 */
checkControl(pcv); /* コントロールをチェックする */
break;
}
}
}
/******************************************************************************
* checkControl(): コントロールのチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void checkControl(ComVal *pcv)
{
int partCode; /* コントロールのパートコード */
Control **ctrlHdl; /* コントロールハンドル */
/* マウスのボタンが押されている間、コントロールの各種処理をシステムに
任せて、コントロールハンドルとボタンが押された、または離された場所
のパートコードを取得する */
partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, NULL, &ctrlHdl);
/* 文字ボタンで、ハンドルも一致した? */
if (partCode == C_INBTTN && ctrlHdl == pcv->chrBtnHdl)
/* エラーダイアログの例を表示する */
exampleError(pcv);
}
/******************************************************************************
* msRDownEvent(): マウスライトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: ウィンドウ上でマウスの右ボタンが押された場合の処理を行う。
*/
void msRDownEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウで、
ウィンドウがアクティブか、OPT.1キーが押されたか? */
if (pcv->event.ev.whom.win == pcv->windowPtr
&& (pcv->activeFlag || pcv->event.ev.how & KS_OPT1))
selectMenu(pcv); /* メニューの作成と選択処理を行う */
}
/******************************************************************************
* selectMenu(): ポップアップメニューの作成と選択処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void selectMenu(ComVal *pcv)
{
int i;
int num; /* メニューのアイテム番号 */
Menu **menuHdl; /* メニューハンドル */
char str[256];
static char *menuItem[7] = { /* メニューアイテム */
"イエローフラッグ,",
"レッドフラッグ,",
"はい/いいえ,",
"保存/終了,",
"実行/取消,",
"継続/中止,",
"タスク名付き"
};
/* メニュー定義文字列の作成 */
str[0] = 0;
for (i = 0; i < 7; i++) {
if (i == pcv->lastMenu - 1)
strcat(str, "!"); /* チェックマークを表示する */
strcat(str, menuItem[i]);
}
menuHdl = MNConvert( /* メニューを作成する */
NULL, /* メニューハンドルを確保する */
str, /* メニュー定義文字列 */
MI_PLN); /* タイトル無しのリソースID */
if (menuHdl == NULL) {
pcv->errorCode = 6; /* 作成できなかった */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
return;
}
/* メニューの表示と選択を行う */
num = MNSelect( /* メニューの表示と選択を行う */
menuHdl, /* メニューハンドル */
pcv->event.ev.where.x_y); /* マウスの右ボタンが押された位置 */
MMHdlDispose(menuHdl); /* メニューハンドルを解放する */
switch (num) {
case 1: /* イエローフラッグ */
case 2: /* レッドフラッグ */
case 3: /* はい/いいえ */
case 4: /* 保存/終了 */
case 5: /* 実行/取消 */
case 6: /* 継続/中止 */
case 7: /* タスク名付き */
pcv->lastMenu = num; /* 選択されたアイテム番号を保存する */
break;
}
}
/******************************************************************************
* keyDownEvent(): キーダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: OPT.1+'Q'キーでの終了処理を行う。
*/
void keyDownEvent(ComVal *pcv)
{
int shortCut; /* ショートカットキー */
if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか? */
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
if (shortCut == 'Q') /* 終了か? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* updateEvent(): アップデート処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* アップデート処理としてウィンドウ内部を描画する。
* この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
* イベントの処理ができなくなります。
*/
void updateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
WMUpdate(pcv->windowPtr); /* アップデートを開始する */
drawGraph(pcv); /* ウィンドウ内部を描画する */
WMUpdtOver(pcv->windowPtr); /* アップデートを終了する */
}
}
/******************************************************************************
* drawGraph(): ウィンドウ内部の描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawGraph(ComVal *pcv)
{
CMDraw(pcv->windowPtr); /* すべてのコントロールを描画する */
}
/******************************************************************************
* activateEvent(): アクティベートイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: アクティブ、インアクティブによるアクティブフラグの切り替えと、
* イベントマスクの切り替えを行う。
*/
void activateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
pcv->activeFlag = TRUE; /* アクティブフラグをセットする */
/* アクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK | EM_KEYDOWN;
/* イベントが他のウィンドウで、自分がアクティブ状態か? */
} else if (pcv->activeFlag) {
pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
/* インアクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK;
}
}
/******************************************************************************
* systemEvent(): システムイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: 全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
* 対応した処理を行う。
*/
void systemEvent(ComVal *pcv)
{
switch (pcv->event.ts.what2) { /* イベントの種類は? */
case CLOSEALL: /* 全ウィンドウのクローズ */
case ENDTSK: /* 全タスクの終了 */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
case WINDOWSELECT: /* ウィンドウのセレクト */
WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
break;
}
}
/******************************************************************************
* showErrDialog(): エラーダイアログの表示
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void showErrDialog(ComVal *pcv)
{
int i;
static struct { /* エラー情報 */
int code; /* エラーコード */
int manager; /* 使用するマネージャ */
int flag; /* 表示フラッグ */
char *message; /* エラーメッセージ */
} errInfo[] = {
{ 1, 1, D_RED, "SX SYSTEMのバージョンが違います。" },
{ 2, 2, D_RED, "ウィンドウが作成できません。" },
{ 3, 2, D_RED, "コントロールが作成できません。" },
{ 6, 1, D_RED, "メニューが作成できません。" },
{ 0, 1, D_YELLOW, "エラーが発生しました。" }
};
for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す */
if (errInfo[i].code == pcv->errorCode)
break;
switch (errInfo[i].manager) { /* マネージャの選択 */
case 1: /* ダイアログマン */
DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
case 2: /* タスクマン */
TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
}
}
/******************************************************************************
* endProc(): 終了手続き
******************************************************************************
* 引数: int code 終了コード
* ComVal *pcv 共通変数へのポインタ
* 注釈: ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
*/
void endProc(int code, ComVal *pcv)
{
/* ウィンドウポインタが確保されたままか? */
if (pcv->windowPtr != NULL) {
CMKill(pcv->windowPtr); /* すべてのコントロールを廃棄する */
WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する */
}
exit(code); /* プログラムを終了する */
}
/******************************************************************************
* exampleError(): いろいろなエラーダイアログの例
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void exampleError(ComVal *pcv)
{
/* メニューで選んだエラーダイアログを表示する */
switch (pcv->lastMenu) {
case 1: /* イエローフラッグ */
DMError(D_YELLOW | D_CONFIRM, "このファイルは実行できません。");
break;
case 2: /* レッドフラッグ */
DMError(D_RED | D_CONFIRM, "メモリの空き容量がありません\r"
"ウィンドウをクローズしてください。");
break;
case 3: /* はい/いいえ */
DMError(D_YESNO, "指定されたファイル名が存在します。\r"
"上書きしてもよろしいですか?");
break;
case 4: /* 保存/終了 */
DMError(D_SAVE, "保存せずに終了しますか?");
break;
case 5: /* 実行/取消 */
DMError(D_EXEC, "現在までの編集結果を破棄します。");
break;
case 6: /* 継続/中止 */
DMError(D_CONT, "プリンタの準備ができていません。");
break;
case 7: /* タスク名付き */
TSErrDialogN(D_EXEC, " 1 個のファイルが編集されています。\r"
"終了してよろしいですか?");
break;
}
}